# 0. Cleaning and set-up R----
rm(list = ls())
source("../pass.R")
library(pacman)
p_load(
dplyr,
jsonlite
)
library(readxl)
# Find airports----
myflights <- read_excel("flights.xlsx")
tosearch <- data.frame(
toloc = (sort(append(myflights$start, myflights$end))),
stringsAsFactors = F
)
tosearch <- tosearch %>% count(toloc) %>% arrange(desc(n)) %>% as.data.frame()
tosearch$tofun <- gsub(" ", "+", tosearch$toloc)
tosearch$tofun <- ifelse(tosearch$toloc == "San Sebastian",
"san+sebastian+es",
tosearch$tofun
)
airports <- function(place, n = 1, lang = "en") {
url <- paste(
"http://api.geonames.org/searchJSON?formatted=true&username=",
GEONAMES_USER,
"&style=medium&fcode=AIRP&lang=",
lang,
"&maxRows=",
paste(n),
"&q=",
place,
sep = ""
)
geonames <- fromJSON(url)
geonames <- data.frame(geonames[["geonames"]])
geonames$search <- place
geonames <- geonames %>% select(
tofun = search,
toponymName,
countryCode,
long = lng,
lat
)
return(geonames)
}
# Return
for (i in 1:nrow(tosearch)) {
res <- airports(tosearch[i, c("tofun")])
row.names(res) <- i
if (i == 1) {
final <- res
} else {
final <- rbind(final, res)
}
rm(res)
}
rm(i)
final$long <- as.numeric(final$long)
final$lat <- as.numeric(final$lat)
# Some statistics----
# Number times per city----
ndots <- left_join(tosearch, final) %>%
select(
name = toloc,
countryCode,
Airport = toponymName,
n,
long,
lat
)
# Connecting Routes----
connect <- myflights %>% count(start, end) %>% arrange(desc(n))
connect <- left_join(
connect,
ndots %>%
select(
start = name,
long_init = long,
lat_init = lat
)
)
connect <- left_join(
connect,
ndots %>%
select(
end = name,
long_end = long,
lat_end = lat
)
)
library(geosphere)
connectflights <- gcIntermediate(
connect[, c("long_init", "lat_init")],
connect[, c("long_end", "lat_end")],
n = 1000,
breakAtDateLine = T,
sp = T
)
# Leaflet-----
library(leaflet)
map <- leaflet(options = leafletOptions(minZoom = 2)) %>%
addProviderTiles(providers$CartoDB.DarkMatter,
options = list(
detectRetina = TRUE,
noWrap = TRUE
)
) %>%
setView(-3.56948, 40.49181, zoom = 3) %>%
setMaxBounds(-180, -90, 180, 90) %>%
addCircles(
data = ndots,
lng = ~long,
lat = ~lat,
weight = 5,
radius = sqrt(ndots$n) * 8000,
popup = ~name,
color = "blue",
group = "Destinies"
)
map <- addPolylines(map,
weight = 2 * sqrt(connect$n), data = connectflights, opacity = sqrt(connect$n) / 5,
col = "blue", group = "Flights"
)
map <- addEasyButton(map, easyButton(
icon = "fa-globe", title = "Zoom to Level 1",
onClick = JS("function(btn, map){ map.setZoom(1); }")
))
library(leaflet.extras)
map <- addHeatmap(map, data = ndots, intensity = ~n, group = "Heatmap")
map <- addLayersControl(map,
overlayGroups = c("Destinies", "Flights", "Heatmap"),
options = layersControlOptions(collapsed = FALSE)
)
map <- hideGroup(map, c("Destinies", "Flights"))
map